/*
给定一个1～N的排列a[i]，每次将相邻两个数相加，得到新序列，再对新序列重复这样的操作，
显然每次得到的序列都比上一次的序列长度少1，最终只剩一个数字。
　　例如:
　　3 1 2 4
　　4 3 6
　　7 9
　　16
现在如果知道N和最后得到的数字sum，请求出最初序列a[i]，为1～N的一个排列。
若有多种答案，则输出字典序最小的那一个。数据保证有解。

样例输入
4 16
样例输出
3 1 2 4
*/
//这个题没有AC，答案可以算出来，但是不会结束递归，我的结果是所有的正确答案，而不是正确答案的第一个解
#include<bits/stdc++.h>
using namespace std;
vector<int> ans;
vector<vector<int> > result;
void backtracking(int n,int target,bool flag,vector<bool>& used,vector<int>& arr){
	if(flag==false) return;
	vector<int> temp;
	if(ans.size()==arr.size()){
		for(int i=0;i<n;i++) temp.push_back(ans[i]);
		for(int i=1;i<n;i++){
			for(int j=0;j<n-i;j++){
				temp[j]=temp[j]+temp[j+1];
			}
		}
		if(temp[0]==target){
			//for(int i=0;i<n;i++) cout<<ans[i]<<" ";
			result.push_back(ans);
			flag=false;
		}
		return ;

	} 
		for(int i=0;i<n;i++){
			if(used[i]==true) continue;
			used[i]=true;
			ans.push_back(arr[i]);
			backtracking(n,target,flag,used,arr);
			ans.pop_back();
			used[i]=false;
		}
	
	return;
}
int main(){
	int n,target;cin>>n>>target;
	vector<bool> used(n,false);
	bool flag=true;
	vector<int> arr;
	for(int i=0;i<n;i++) arr.push_back(i+1);
	backtracking(n,target,flag,used,arr);
	for(int i=0;i<n;i++) cout<<result[0][i]<<" "; 
} 
